原帖 | Jack | 2024-08-08 09:14 | 👍3 | 阅读约1
问:
我们会为每一个器件或者设备都建立一个task吗?比如我的移动机器人地盘有很多个不同执行机构的电机,有很多种传感器采集数据,如果每一种都创建task会不会导致内存的浪费?调度资源的浪费?
答:
我们会为某一类设备建立一个或者多个task。
先说“一类”的情况,比如,我有个BSP程序,它是专门拿来管理温湿度类的设备的,它能同时管理AHT21、DHT11这类温湿度采集设备,为什么能管理呢?因为,温度类的设备管理逻辑都一样,他们读个温度,由于温度是大惯性参数,温度不需要1秒读个几千次,读一个温度往往可以用一两秒(如果要求不高的话),那么这对我们来说,无论是AHT21还是DHT11,那都是一样的管理流程。那么AHT21和DHT11的区别是什么呢?其实就是HAL的驱动不一样罢了,但是他们最终都会有读取温度接口,读取设备ID接口给Handler层用,所以Handler是通用的,只是HAL层是各个设备是各个设备的,那么我们只需要写出符合我们Handler层需要的接口的HAL驱动就可以了(Handler+event+回调的实战分析见 AHT21这个handler这个策略效率好高),Handler层的代码可以无限复用。
对于多个Task的情况,比如,你的电机是非常高速的设备 ,读电机电压 电流的APP需要超快的响应。如果你只有一个线程那肯定做不到了,因为只有一个线程的话,当这个线程在采集电压时,它肯定不能立刻回到信号量或者队列接收函数那里去响应调用,所以就会有2个线程,一个线程专门响应外部调用API,另一个线程专门是用来做电压采集的。这个更明显的例子是我们后面的音频播放Speaker高级驱动的开发。
相关笔记